// 开启严格模式
'use strict';

// 提示类名
var PROMPT = '.modal_frame-form-prompt';
var SHOW = 'down';
// 成功类名
var SUCCESS = 'success';
// 错误类名
var ERROR = 'error';
// 请求类型
var METHOD = '';
// 请求地址
var URL = '';

/**
 * 初始化
 * @return void
 */
(function init() {
    // 变化校验
    changeRules('check');
})()

/**
 * 重置表单
 * @param {Boolean} isFast 是否快速
 * @return void
 */
function resetForm(isFast) {
    // 重置表单
    isFast ? $('.container-form')[0].reset() : $('.modal_frame-form')[0].reset();
}

/**
 * 变化校验
 * @param {String} operation 操作
 * @param {Boolean} isFast 是否快速
 * @return void
 */
function changeRules(operation, isFast) {
    // 名称
    var name = $('#name');
    var fast_name = $('#fast_name');
    var namePattern = /^.{2,10}$/;
    // 控制器
    var controller = $('#controller');
    var controllerPattern = /^[A-Z]{1}[A-Za-z]+$/;

    switch (operation) {
        // 校验
        case 'check':
            // 名称校验
            name.bind('input propertychange blur', function () {
                if ($(this).val() === '') {
                    $(this).siblings(PROMPT).text('名称不能为空').addClass(SHOW);
                    $(this).removeClass(SUCCESS).addClass(ERROR);
                } else if (!namePattern.test($(this).val())) {
                    $(this).siblings(PROMPT).text('长度在 2 到 10 个字符').addClass(SHOW);
                    $(this).removeClass(SUCCESS).addClass(ERROR);
                } else {
                    $(this).siblings(PROMPT).removeClass(SHOW);
                    $(this).removeClass(ERROR).addClass(SUCCESS);
                }
            })

            // 控制器校验
            controller.bind('input propertychange blur', function () {
                if ($(this).val() === '') {
                    $(this).siblings(PROMPT).text('控制器名不能为空').addClass(SHOW);
                    $(this).removeClass(SUCCESS).addClass(ERROR);
                } else if (!controllerPattern.test($(this).val())) {
                    $(this).siblings(PROMPT).text('长度 2 个以上字符 首字母大写 ThinkPHP 控制器名').addClass(SHOW);
                    $(this).removeClass(SUCCESS).addClass(ERROR);
                } else {
                    $(this).siblings(PROMPT).removeClass(SHOW);
                    $(this).removeClass(ERROR).addClass(SUCCESS);
                }
            })

            // 名称校验
            fast_name.bind('input propertychange blur', function () {
                if ($(this).val() === '') {
                    $(this).siblings(PROMPT).text('名称不能为空').addClass(SHOW);
                    $(this).removeClass(SUCCESS).addClass(ERROR);
                } else if (!namePattern.test($(this).val())) {
                    $(this).siblings(PROMPT).text('长度在 2 到 10 个字符').addClass(SHOW);
                    $(this).removeClass(SUCCESS).addClass(ERROR);
                } else {
                    $(this).siblings(PROMPT).removeClass(SHOW);
                    $(this).removeClass(ERROR).addClass(SUCCESS);
                }
            })
            break;
        // 重置校验
        case 'reset':
            if (isFast) {
                // 重置名称
                fast_name.removeClass(SUCCESS + ' ' + ERROR);
                fast_name.siblings(PROMPT).removeClass(SHOW);
                // 重置表单(是否快速)
                resetForm(true);
            } else {
                // 重置名称
                name.removeClass(SUCCESS + ' ' + ERROR);
                name.siblings(PROMPT).removeClass(SHOW);
                // 重置控制器
                controller.removeClass(SUCCESS + ' ' + ERROR);
                controller.siblings(PROMPT).removeClass(SHOW);
                // 重置表单
                resetForm();
            }
            break;
    }
}

/**
 * 校验
 * @return void
 */
function rules() {
    // 校验结果
    var result = true;
    // 名称
    var name = $('#name');
    var namePattern = /^.{2,10}$/;
    // 控制器
    var controller = $('#controller');
    var controllerPattern = /^[A-Z]{1}[A-Za-z]+$/;

    // 名称校验
    if (name.val() === '') {
        name.siblings(PROMPT).text('名称不能为空').addClass(SHOW);
        name.addClass(ERROR);
        result = false;
    } else if (!namePattern.test(name.val())) {
        name.siblings(PROMPT).text('长度在 2 到 10 个字符').addClass(SHOW);
        name.addClass(ERROR);
        result = false;
    } else {
        name.addClass(SUCCESS);
    }

    // 控制器校验
    if (controller.val() === '') {
        controller.siblings(PROMPT).text('控制器不能为空').addClass(SHOW);
        controller.addClass(ERROR);
        result = false;
    } else if (!controllerPattern.test(controller.val())) {
        controller.siblings(PROMPT).text('长度 2 个以上字符 首字母大写 ThinkPHP 控制器名').addClass(SHOW);
        controller.addClass(ERROR);
        result = false;
    } else {
        controller.addClass(SUCCESS);
    }

    // 错误元素
    var error = $('#form-modal_frame .' + ERROR).eq(0);
    // 获取焦点
    error.focus();

    // 返回校验结果
    return result;
}

/**
 * 快速校验
 * @return void
 */
function fastRules() {
    // 校验结果
    var result = true;
    // 名称
    var fast_name = $('#fast_name');
    var fast_namePattern = /^.{2,10}$/;

    // 名称校验
    if (fast_name.val() === '') {
        fast_name.siblings(PROMPT).text('名称不能为空').addClass(SHOW);
        fast_name.addClass(ERROR);
        result = false;
    } else if (!fast_namePattern.test(fast_name.val())) {
        fast_name.siblings(PROMPT).text('长度在 2 到 10 个字符').addClass(SHOW);
        fast_name.addClass(ERROR);
        result = false;
    } else {
        fast_name.addClass(SUCCESS);
    }

    // 错误元素
    var error = $('.container-form .' + ERROR).eq(0);
    // 获取焦点
    error.focus();

    // 返回校验结果
    return result;
}

/**
 * 添加
 * @param {Type} _this 当前DOM
 * @param {Type} url 地址
 * @return void
 */
function add(_this, url) {
    // 设置请求类型
    METHOD = 'post';
    // 设置请求地址
    URL = url;
    // 校验
    if (fastRules()) {
        // 添加加载
        actionLoading(_this, 'add', 'icon-btn');
        // 请求(当前DOM, 是否快速)
        request(_this, true);
    }
}

/**
 * 编辑
 * @param {Object} _this 当前DOM
 * @param {String} url 地址
 * @return void
 */
function edit(_this, url) {
    // 设置请求类型
    METHOD = 'put';
    // 设置请求地址
    URL = url;
    // 添加加载
    actionLoading(_this, 'add', 'icon-btn');
    // 删除父级编号
    if ($('#parent_id').length) $('#parent_id').remove();
    // 请求数据
    axios.get(URL).then(function (res) {
        // 删除加载
        actionLoading(_this, 'remove', 'icon-btn');
        // 重置变化校验
        changeRules('reset');
        // 设置名称
        $('#name').val(res.data.data.name);
        // 设置控制器名
        $('#controller').val(res.data.data.controller);
        // 设置打开方式
        $('#target_' + res.data.data.target).prop('checked', true);
        // 显示模态框
        showModalFrame('#form-modal_frame', '.form-modal_frame-container', '.form-modal_frame-title', true);
    }).catch(function (err) {
        // 消息提示
        message('add', 'error', err);
        // 删除加载
        actionLoading(_this, 'remove', 'icon-btn');
    })
    
}

/**
 * 提交
 * @param {Object} _this 当前DOM
 * @return void
 */
function onSubmit(_this) {
    // 检验
    if (rules()) {
        // 添加加载
        actionLoading(_this, 'add', 'submit');
        // 请求
        request(_this);
    }
}

/**
 * 添加子栏目
 * @param {Number|String} parent_id 父级编号
 * @param {String} controller 控制器
 * @param {String} url 地址
 * @return void
 */
function addChildren(parent_id, controller, url) {
    // 设置请求类型
    METHOD = 'post';
    // 设置请求地址
    URL = url;
    // 设置父级编号
    var inputHidden = '<input id="parent_id" type="hidden" name="parent_id" value="' + parent_id + '" />';
    // 追加父级编号
    $('.modal_frame-form').append(inputHidden);
    // 重置变化校验
    changeRules('reset');
    // 设置控制器
    $('#controller').val(controller);
    // 显示模态框
    showModalFrame('#form-modal_frame', '.form-modal_frame-container', '.form-modal_frame-title', true);
}

/**
 * 请求
 * @param {Object} _this 当前DOM
 * @param {Boolean} isFast 是否快速
 * @return void
 */
function request(_this, isFast) {
    // 获取数据
    var data = {};
    // 判断是否快速
    var loadingType = isFast ? 'icon-btn' : 'submit';
    data.name = isFast ? $('#fast_name').val() : $('#name').val();
    if (!isFast) {
        data.controller = $('#controller').val();
        data.target = $('[name="target"]:checked').val();
        data.parent_id = $('#parent_id').val();
    }

    // 发送请求
    axios({
        method: METHOD,
        url: URL,
        data: data
    }).then(function (res) {
        // 消息提示
        message('add', res.data.type, res.data.message);
        // 删除加载
        actionLoading(_this, 'remove', loadingType);
        // 判断是否操作成功
        if (res.data.state === 200) {
            // 判断是否快速
            if (isFast) {
                // 重置变化校验
                changeRules('reset', true);
            } else {
                // 隐藏模态框
                hideModalFrame(event, '#form-modal_frame', true);
                // 重置变化校验
                changeRules('reset');
            }

            // 延迟定时器
            setTimeout(function () {
                // 刷新页面
                window.location.reload();
            }, 400);
        }
    }).catch(function (err) {
        // 消息提示
        message('add', 'err', err);
        // 删除加载
        actionLoading(_this, 'remove', loadingType);
    })
}

/**
 * 删除
 * @param {Type} _this 当前DOM
 * @param {Type} url 地址
 * @return void
 */
function onDelete(_this, url) {
    // 显示确认框
    confirmation(event, 'show', function () {
        // 隐藏确认框
        confirmation(event, 'hide');

        // 添加加载
        actionLoading(_this, 'add', 'icon-btn');

        // 发送请求
        axios.delete(url).then(function (res) {
            // 消息提示
            message('add', res.data.type, res.data.message);

            // 删除加载
            actionLoading(_this, 'remove', 'icon-btn');

            // 判断是否删除成功
            if (res.data.state === 200) $(_this).parents('.table-tr').remove();    // 删除数据
        }).catch(function (err) {
            // 消息提示
            message('add', 'error', err);

            // 删除加载
            actionLoading(_this, 'remove', 'icon-btn');
        })
    })
}


/**
 * 切换子栏目
 * @param {Type} _this 当前DOM
 * @return void
 */
function toggleChildren(_this) {
    // 获取属性
    var title = $(_this).prop('title');
    // 判断属性
    title = title === '展开' ? '收缩' : '展开';

    // 切换类名/标题
    $(_this).toggleClass('fa-caret-right fa-caret-down').prop('title', title);

    // 获取tr
    var tr = $(_this).parents('tr');
    // 获取编号
    var id = tr.attr('this-id');
    
    // 切换
    $('[parent-id="' + id + '"]').toggle();
}